package com.shujia.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Demo03GetRDD {
  def main(args: Array[String]): Unit = {

    // 创建RDD的方式：1、读文件  2、从Scala的本地集合构建
    val conf = new SparkConf()
    conf.setMaster("local")
    conf.setAppName(this.getClass.getSimpleName.replace("$", ""))
    val sc = new SparkContext(conf)
    // 读文件：适用于一般大数据流程
    val lineRDD01: RDD[String] = sc.textFile("spark/data/words/words.txt")
    lineRDD01.foreach(println)

    // 从本地集合构建：主要适用于学习及测试
    // lineRDD02：单值RDD
    // lineRDD03：KV格式的RDD
    val lineRDD02: RDD[String] = sc.parallelize(List[String]("java,java,java", "scala,scala", "spark"))
    val lineRDD03: RDD[(String,Int)] = sc.parallelize(Map[String, Int]("k1" -> 1, "k2" -> 2, "k3" -> 3).toList)
    lineRDD02.foreach(println)
    lineRDD03.foreach(println)


    // RDD vs List
    val list: List[Int] = List(1, 2, 3, 4, 5, 6)

    val rdd: RDD[Int] = sc.parallelize(list)

    /**
     * RDD的操作称为算子
     * 算子可以分为两大类：转换算子Transformation、行为算子Action
     * 转换算子 需要 行为算子 的触发才能执行
     * 转换算子是懒执行的
     *
     * 如何区分行为算子/转换算子？
     * 观察算子的返回值是否为RDD
     * 由一个RDD变成了另一个RDD：转换算子
     * 由一个RDD变成了其它类型：行为算子
     * 行为算子的个数决定了Spark程序Job的数量
     */
    rdd
      .map(i=>{
        println("进入了RDD的map方法")
        i
      })
//      .foreach(println)

    list
      .map(i=>{
        println("进入了List的map方法")
        i
      })
//      .foreach(println)



  }

}
